﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace MacroprocesosWPF.Usuario
{
    /// <summary>
    /// Lógica de interacción para Principal.xaml
    /// </summary>
    public partial class Principal : Window
    {
        private object dummyNode = null;

        public Principal()
        {
            InitializeComponent();
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            //cargar arbol de procesos

            //cargar vista de iconos     
            CargarArbolProcesos();   
         
            List<PlainDocument> lista = GenerarListaProcesosPadre(); 
            ListaProcesos2.ItemsSource = lista;
        }


        public void CargarArbolProcesos()
        {
            Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Empresa> lista = empresaBLL.Listar();

            treeMacroprocesos.Items.Clear();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Empresa emp in lista)
            {
                TreeViewItem item = new TreeViewItem();
                item.Header = emp.NombreEmpresa;
                item.Tag = emp;
                item.FontWeight = FontWeights.Thin;
                item.Items.Add(dummyNode);
                item.Expanded += new RoutedEventHandler(empresa_Expanded);
                treeMacroprocesos.Items.Add(item);
            }
        }

        private void empresa_Expanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = (TreeViewItem)sender;

            if (item.Items.Count == 1 && item.Items[0] == dummyNode)
            {
                item.Items.Clear();
                try
                {
                    if (item.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = item.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;
                        Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista = procesoBLL.Listar(selectedEmpresa);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso proc in lista)
                        {
                            TreeViewItem subItem = new TreeViewItem();
                            subItem.Header = proc.Nombre;
                            subItem.Tag = proc;
                            subItem.FontWeight = FontWeights.Thin;
                            subItem.Items.Add(dummyNode);
                            subItem.Expanded += new RoutedEventHandler(empresa_Expanded);
                            item.Items.Add(subItem);
                        }

                    }
                    else if (item.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = item.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;
                        Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProc = procesoBLL.Listar(selectedProceso);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso proc in listaProc)
                        {
                            TreeViewItem subItemProc = new TreeViewItem();
                            subItemProc.Header = proc.Nombre;
                            subItemProc.Tag = proc;
                            subItemProc.FontWeight = FontWeights.Thin;
                            subItemProc.Items.Add(dummyNode);
                            subItemProc.Expanded += new RoutedEventHandler(empresa_Expanded);
                            item.Items.Add(subItemProc);
                        }

                        Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL documentoBLL = new Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Documento> listaDoc = documentoBLL.Listar(selectedProceso);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Documento doc in listaDoc)
                        {
                            TreeViewItem subItemDoc = new TreeViewItem();
                            subItemDoc.Header = doc.Nombre;
                            subItemDoc.Tag = doc;
                            subItemDoc.FontWeight = FontWeights.Thin;
                            item.Items.Add(subItemDoc);
                        }
                    }
                }
                catch { }
            }
        }



        private List<PlainDocument> GenerarListaProcesosPadre()
        {
            //se selecciona la empresa UNIMAQ por defecto
            Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL();
            Unimaq.Macroprocesos.AccesoDatos.Empresa empresa = empresaBLL.GetEmpresa("unimaq");

            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listProceso = procesoBLL.Listar(empresa);

            List<PlainDocument> listDocument = new List<PlainDocument>();
            PlainDocument newDocument;

            foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listProceso)
            {
                newDocument = new PlainDocument()
                {
                    Id = p.Id,
                    IdPadre = p.IdPadreProceso.HasValue ? p.IdPadreProceso.Value : 0,
                    Codigo = p.CodigoProceso,
                    Nombre = p.Nombre,
                    Ruta = p.RutaAcceso,
                    Tipo = "Proceso"
                };

                listDocument.Add(newDocument);
            }

            return listDocument;
        }

        private List<PlainDocument> GenerarListaProceso(PlainDocument document)
        {
            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listProceso = procesoBLL.Listar(new Unimaq.Macroprocesos.AccesoDatos.Proceso() { Id = document.Id });

            Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL documentoBLL = new Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Documento> listDocumento = documentoBLL.Listar(new Unimaq.Macroprocesos.AccesoDatos.Proceso() { Id = document.Id });

            List<PlainDocument> listDocument = new List<PlainDocument>();
            PlainDocument newDocument;

            foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listProceso)
            {
                newDocument = new PlainDocument()
                {
                    Id = p.Id,
                    IdPadre = p.IdPadreProceso.HasValue ? p.IdPadreProceso.Value : 0,
                    Codigo = p.CodigoProceso,
                    Nombre = p.Nombre,
                    Ruta = p.RutaAcceso,
                    Tipo = "Proceso"
                };

                listDocument.Add(newDocument);
            }

            foreach (Unimaq.Macroprocesos.AccesoDatos.Documento d in listDocumento)
            {
                newDocument = new PlainDocument()
                {
                    Id = d.Id,
                    IdPadre = d.IdProceso.HasValue ? d.IdProceso.Value : 0,
                    Codigo = d.Codigo,
                    Nombre = d.Nombre,
                    Ruta = d.RutaAcceso,
                    Tipo = "Documento"
                };

                listDocument.Add(newDocument);
            }

            return listDocument;
        }

        private List<PlainDocument> SubirNivel(PlainDocument document)
        {
            List<PlainDocument> result = new List<PlainDocument>();
            
            if (document != null)
            {
                if (document.IdPadre > 0)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso =
                    new Unimaq.Macroprocesos.AccesoDatos.Proceso()
                    {
                        Id = document.IdPadre
                    };

                    Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
                    Unimaq.Macroprocesos.AccesoDatos.Proceso proceso = procesoBLL.GetProceso(selectedProceso);

                    if (proceso != null)
                    {
                        PlainDocument procesoPadre = new PlainDocument()
                        {
                            Id = proceso.Id,
                            IdPadre = proceso.IdPadreProceso.HasValue ? proceso.IdPadreProceso.Value : 0,
                            Codigo = proceso.CodigoProceso,
                            Nombre = proceso.Nombre,
                            Ruta = proceso.RutaAcceso,
                            Tipo = "Proceso"
                        };

                        result = GenerarListaProceso(procesoPadre);
                    } 
                }          
            }

            return result;
        }



        private void ListaProcesos2_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ListBox control = e.Source as ListBox;
            PlainDocument selectedDocument = control.SelectedItem as PlainDocument;

            if (selectedDocument != null)
            {
                btnSubir.Tag = selectedDocument;

                if (selectedDocument.Tipo.Equals("Proceso"))
                {
                    List<PlainDocument> lista = GenerarListaProceso(selectedDocument);                    

                    if (lista.Count > 0)
                    {
                        //ListaProcesos.Items.Clear();
                        ListaProcesos2.ItemsSource = lista;
                    }
                }
                else if (selectedDocument.Tipo.Equals("Documento"))
                {
                    string ruta = selectedDocument.Ruta;

                    if (!string.IsNullOrWhiteSpace(ruta))
                    {
                        ContentPDFViewer controlPDFViewer = new ContentPDFViewer(ruta);

                        panelContent.Children.Clear();
                        panelContent.Children.Add(controlPDFViewer);
                    }
                }
            }
        }

        private void treeMacroprocesos_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeViewItem selectedItem = (TreeViewItem)treeMacroprocesos.SelectedItem;

            if (selectedItem != null)
            {
                if(selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                {
                    List<PlainDocument> lista = GenerarListaProcesosPadre();
                    btnSubir.Tag = null;

                    if (lista.Count > 0)
                    {
                        panelContent.Children.Clear();
                        ListaProcesos2.ItemsSource = lista;
                        panelContent.Children.Add(ListaProcesos2);
                    }
                }
                else if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = (Unimaq.Macroprocesos.AccesoDatos.Proceso)selectedItem.Tag;
                    PlainDocument selectedDocument = new PlainDocument()
                    {
                        Id = selectedProceso.Id,
                        IdPadre = selectedProceso.IdPadreProceso.HasValue ? selectedProceso.IdPadreProceso.Value : 0,
                        Codigo = selectedProceso.CodigoProceso,
                        Nombre = selectedProceso.Nombre,
                        Ruta = selectedProceso.RutaAcceso,
                        Tipo = "Proceso"
                    };

                    List<PlainDocument> lista = GenerarListaProceso(selectedDocument);
                    btnSubir.Tag = selectedDocument;

                    if (lista.Count > 0)
                    {
                        panelContent.Children.Clear();                        
                        ListaProcesos2.ItemsSource= lista;
                        panelContent.Children.Add(ListaProcesos2);
                    }
                }
                else if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = (Unimaq.Macroprocesos.AccesoDatos.Documento)selectedItem.Tag;
                    string ruta = selectedDocumento.RutaAcceso;

                    PlainDocument selectedDocument = new PlainDocument()
                    {
                        Id = selectedDocumento.Id,
                        IdPadre = selectedDocumento.IdProceso.HasValue ? selectedDocumento.IdProceso.Value : 0,
                        Codigo = selectedDocumento.Codigo,
                        Nombre = selectedDocumento.Nombre,
                        Ruta = selectedDocumento.RutaAcceso,
                        Tipo = "Documento"
                    };
                    btnSubir.Tag = selectedDocument;

                    if (!string.IsNullOrWhiteSpace(ruta))
	                {
                        ContentPDFViewer controlPDFViewer = new ContentPDFViewer(ruta);

                        panelContent.Children.Clear();
                        panelContent.Children.Add(controlPDFViewer);
	                }                   
                }
            }
        }



        private void btnInicio_Click(object sender, RoutedEventArgs e)
        {
            panelContent.Children.Clear();            
            ListaProcesos2.ItemsSource = GenerarListaProcesosPadre();
            panelContent.Children.Add(ListaProcesos2);
        }

        private void btnSubir_Click(object sender, RoutedEventArgs e)
        {
            if (btnSubir.Tag != null)
            {
                PlainDocument selectedDocument = btnSubir.Tag as PlainDocument;

                if (selectedDocument != null)
                {
                    panelContent.Children.Clear();
                    List<PlainDocument> lista = SubirNivel(selectedDocument);
                    ListaProcesos2.ItemsSource = lista;
                    
                    if (lista.Count > 0)
                    {
                        panelContent.Children.Add(ListaProcesos2); 
                    }
                }
            }
        }
    }
}
